package com.itbaizhan.paymentdemo.config;

import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier;
import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import lombok.Data;
import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;
import java.security.PrivateKey;


/*
* 微信支付的配置文件*/

//wxpay.properties 里的信息名的前缀
@ConfigurationProperties(prefix = "wxpay")
//读取配置文件
//wxpay.properties 文件的路径 有classpath: 指的是resources下的文件
//如果没有classpath: 则表示不是resources 下的文件
@PropertySource("classpath:wxpay.properties")
//使用set方法将wxpay节点中的值填充到当前类的属性中
@Data
@Configuration
public class WxPayConfig {

    // 商户号
    private String mchId;

    // 商户API证书序列号
    private String mchSerialNo;

    // 商户私钥文件
    private String privateKeyPath;

    // APIv3密钥
    private String apiV3Key;

    // APPID
    private String appid;

    // 微信服务器地址
    private String domain;

    // 接收结果通知地址
    private String notifyDomain;


    //启动时就要加载私钥,放进了spring容器中，启动了就会得到私钥，
    // 下面的方法（方法有@Bean）就能以参数形式获取得
    @Bean
    public PrivateKey getPrivateKey(){
        // 加载商户私钥（privateKey：私钥字符串）
        try {
            PrivateKey privateKey = PemUtil
                    //在上面定义了私钥的路径privateKeyPath，上面的privateKeyPath是从wxpay.properties中得到，而配置文件定义了哪个文件
                    .loadPrivateKey(new FileInputStream(privateKeyPath));
                    return privateKey;
        } catch (FileNotFoundException e) {
            throw  new RuntimeException("私钥文件不存在",e);
        }
    }


    /*加载证书
    *放进spring容器中，从容器中获得私钥 */
    @Bean
    public AutoUpdateCertificatesVerifier getVerifier(PrivateKey privateKey) throws UnsupportedEncodingException {
        //私钥签对象  第一参数是商户API证书序列号    第二个参数是  私钥
        PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, privateKey);
        //身份认证
        WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner);

        //加载平台证书（加载平台证书（mchId：商户号,mchSerialNo：商户证书序列号,apiV3Key：V3密钥）
        AutoUpdateCertificatesVerifier autoUpdateCertificatesVerifier = new AutoUpdateCertificatesVerifier(wechatPay2Credentials, apiV3Key.getBytes("utf-8"));

        return  autoUpdateCertificatesVerifier;

    }


    /**
     * 获取Http请求对象
     * @param privateKey
     * @param autoUpdateCertificatesVerifier
     * @return
     */
    @Bean(name="wcPayHttpClient")
    public CloseableHttpClient getWxHttpClient(PrivateKey privateKey, AutoUpdateCertificatesVerifier autoUpdateCertificatesVerifier){

        //初始化httpClient
        CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create()
                .withMerchant(mchId, mchSerialNo, privateKey)
                .withValidator(new WechatPay2Validator(autoUpdateCertificatesVerifier)).build();
                return httpClient;
    }


    // 加载平台证书（mchId：商户号,mchSerialNo：商户证书序列号,apiV3Key：V3密钥）
//    AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
//            new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8"));
//
//    // 初始化httpClient
//    httpClient = WechatPayHttpClientBuilder.create()
//            .withMerchant(mchId, mchSerialNo, merchantPrivateKey)
//            .withValidator(new WechatPay2Validator(verifier)).build();
//}
//
//    @After
//    public void after() throws IOException {
//        httpClient.close();
//    }
}
